package com.bls.cate.utils;

import android.content.Context;
import android.os.Bundle;

import com.blankj.utilcode.util.LogUtils;
import com.iflytek.cloud.ErrorCode;
import com.iflytek.cloud.InitListener;
import com.iflytek.cloud.SpeechConstant;
import com.iflytek.cloud.SpeechError;
import com.iflytek.cloud.SpeechSynthesizer;
import com.iflytek.cloud.SynthesizerListener;
import com.iflytek.sunflower.FlowerCollector;

/**
 * 　　  () 　　　  ()
 * 　　  ( ) 　　　( )
 * 　　  ( ) 　　　( )
 * 　　┏┛┻━━━┛┻┓
 * 　　┃　　　━　　　┃
 * 　　┃　┳┛　┗┳　┃
 * 　　┃　　　┻　　　┃
 * 　　┗━┓　　　┏━┛
 * 　　　　┃　　　┃
 * 　　　　┃　　　┗━━━┓
 * 　　　　┃　　　　　　　┣┓
 * 　　　　┃　　　　　　　┏┛
 * 　　　　┗┓┓┏━┳┓┏┛
 * 　　　　　┃┫┫　┃┫┫
 * 　　　　　┗┻┛　┗┻┛
 * ——————————————————
 * Created by BinglingSu on 2018/5/2.
 */

public class XunFeiUtils {
    private Context context;
    //private InitListenerCallback initListenerCallback;

    public XunFeiUtils(Context context) {
        this.context = context;
    }

    public SpeechSynthesizer initSpeechSynthesizer(final InitListenerCallback initListenerCallback) {

        SpeechSynthesizer speechSynthesizer = SpeechSynthesizer.createSynthesizer(context, new InitListener() {
            @Override
            public void onInit(int code) {
                /*
                 * 初始化监听。
                 * 初始化成功，之后可以调用startSpeaking方法
                 * 注：有的开发者在onCreate方法中创建完合成对象之后马上就调用startSpeaking进行合成，
                 * 正确的做法是将onCreate中的startSpeaking调用移至这里
                 */
                initListenerCallback.onInitCallback(code);
            }
        });

        // 清空参数
        speechSynthesizer.setParameter(SpeechConstant.PARAMS, null);
        // 根据合成引擎设置相应参数
        speechSynthesizer.setParameter(SpeechConstant.ENGINE_TYPE, SpeechConstant.TYPE_CLOUD);
        // 设置在线合成发音人
        speechSynthesizer.setParameter(SpeechConstant.VOICE_NAME, "xiaoqi");
        //设置合成语速
        speechSynthesizer.setParameter(SpeechConstant.SPEED, String.valueOf(30));
        //设置合成音调
        speechSynthesizer.setParameter(SpeechConstant.PITCH, String.valueOf(40));
        //设置合成音量
        speechSynthesizer.setParameter(SpeechConstant.VOLUME, String.valueOf(50));
        //设置播放器音频流类型
        speechSynthesizer.setParameter(SpeechConstant.STREAM_TYPE, String.valueOf(3));
        // 设置播放合成音频打断音乐播放，默认为true
        speechSynthesizer.setParameter(SpeechConstant.KEY_REQUEST_FOCUS, "true");

        // 设置音频保存路径，保存音频格式支持pcm、wav，设置路径为sd卡请注意WRITE_EXTERNAL_STORAGE权限
        // 注：AUDIO_FORMAT参数语记需要更新版本才能生效
        //speechSynthesizer.setParameter(SpeechConstant.AUDIO_FORMAT, "wav");
        //speechSynthesizer.setParameter(SpeechConstant.TTS_AUDIO_PATH, Environment.getExternalStorageDirectory() + "/Article/" + System.currentTimeMillis()+"_"+saveFileName + ".wav");

        return speechSynthesizer;
    }

    public void startSpeech(SpeechSynthesizer speechSynthesizer, String text, final SynthesizerListenerCallback synthesizerListenerCallback) {
        // 移动数据分析，收集开始合成事件
        FlowerCollector.onEvent(context, "tts_play");
        int code = speechSynthesizer.startSpeaking(text, new SynthesizerListener() {
            @Override
            public void onSpeakBegin() {
                synthesizerListenerCallback.onSpeakBegin();
            }

            @Override
            public void onBufferProgress(int i, int i1, int i2, String s) {
                synthesizerListenerCallback.onBufferProgress(i, i1, i2, s);
            }

            @Override
            public void onSpeakPaused() {
                synthesizerListenerCallback.onSpeakPaused();
            }

            @Override
            public void onSpeakResumed() {
                synthesizerListenerCallback.onSpeakResumed();
            }

            @Override
            public void onSpeakProgress(int i, int i1, int i2) {
                synthesizerListenerCallback.onSpeakProgress(i, i1, i2);
            }

            @Override
            public void onCompleted(SpeechError speechError) {
                synthesizerListenerCallback.onCompleted(speechError);
            }

            @Override
            public void onEvent(int i, int i1, int i2, Bundle bundle) {

            }
        });
        if (code != ErrorCode.SUCCESS) {
            LogUtils.i("语音合成失败,错误码: " + code);
        }
    }

    public interface InitListenerCallback {
        /**
         * 初始化监听。
         * 初始化成功，之后可以调用startSpeaking方法
         * 注：有的开发者在onCreate方法中创建完合成对象之后马上就调用startSpeaking进行合成，
         * 正确的做法是将onCreate中的startSpeaking调用移至这里
         */
        void onInitCallback(int code);
    }

    /**
     * 合成回调监听
     */
    public interface SynthesizerListenerCallback {
        void onSpeakBegin();//开始播放

        void onSpeakPaused();//暂停播放

        void onSpeakResumed();//继续播放

        void onCompleted(SpeechError speechError);//播放完成

        void onBufferProgress(int percent, int beginPos, int endPos, String info); //合成进度

        void onSpeakProgress(int percent, int beginPos, int endPos);//播放进度
    }
}
